{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from os import environ\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "environ['optimizer'] = 'Adam'\n",
    "environ['num_workers']= '4'\n",
    "environ['batch_size']= '8192'\n",
    "environ['n_epochs']= '1500'\n",
    "environ['batch_norm']= 'True'\n",
    "environ['loss_func']='BCE'\n",
    "environ['layers'] = '600 350 200 180'\n",
    "environ['dropouts'] = '0.3 '*4\n",
    "environ['log'] = 'False'\n",
    "environ['weight_decay'] = '0.01'\n",
    "environ['cuda_device'] ='cuda:0'\n",
    "environ['dataset'] = '/data/scratch/mmerouani/data/speedup_dataset_research_batch1001-2500.pkl'\n",
    "\n",
    "%run utils.ipynb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"loading data\")\n",
    "\n",
    "# train_dl, val_dl, test_dl = train_dev_split(dataset,val_size=10000, test_size=10000, batch_size=batch_size, num_workers=num_workers, log=log)\n",
    "threshold = 0.2\n",
    "print(f\"threshold= {threshold}\")\n",
    "def set_labels(Y):\n",
    "    return (Y > threshold).astype('float32')\n",
    "train_dl, val_dl, test_dl = train_dev_split_transform(dataset,val_size=10000, test_size=10000, batch_size=batch_size, num_workers=num_workers, log=log,\n",
    "                                                     filter_func=None, transform_func=set_labels)\n",
    "db = fai.basic_data.DataBunch(train_dl, val_dl, test_dl, device=device)\n",
    "\n",
    "print(\"data loaded\")\n",
    "print(val_dl.dataset.X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.]\n"
     ]
    }
   ],
   "source": [
    "print(val_dl.dataset.Y[5050])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_size = train_dl.dataset.X.shape[1]\n",
    "output_size = train_dl.dataset.Y.shape[1]\n",
    "\n",
    "model = None \n",
    "\n",
    "model = Classifier_Model_BN_ELU(input_size, output_size, hidden_sizes=layers_sizes, drops=drops)\n",
    "\n",
    "criterion=bce_criterion\n",
    "\n",
    "l = fai.basic_train.Learner(db, model, loss_func=criterion, metrics=[criterion],\n",
    "               callback_fns=[partial(EarlyStoppingCallback, mode='min', monitor='valid_loss', min_delta=0, patience=150)],silent=True)\n",
    "\n",
    "if optimizer == 'SGD':\n",
    "    l.opt_func = optim.SGD \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "l.lr_find()\n",
    "l.recorder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = 1e-03"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "l.fit_one_cycle(1500, lr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "l.recorder.plot_losses()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "l.save(f\"speedup_{optimizer}_batch_norm_{batch_norm}_{loss_func}_nlayers_{len(layers_sizes)}_log_{log}_batch1001-2500_ELU_classif0.2\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "val_df = get_results_df_classif(val_dl, l.model)\n",
    "train_df = get_results_df_classif(train_dl, l.model)\n",
    "test_df=get_results_df_classif(test_dl, l.model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>prediction</th>\n",
       "      <th>target</th>\n",
       "      <th>speedup</th>\n",
       "      <th>abs_diff</th>\n",
       "      <th>BCELoss</th>\n",
       "      <th>interchange</th>\n",
       "      <th>tile</th>\n",
       "      <th>unroll</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>10000.00000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>1.000000e+04</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>4999.50000</td>\n",
       "      <td>0.587596</td>\n",
       "      <td>0.583100</td>\n",
       "      <td>0.438427</td>\n",
       "      <td>0.079464</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>0.757900</td>\n",
       "      <td>0.940400</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2886.89568</td>\n",
       "      <td>0.455354</td>\n",
       "      <td>0.493082</td>\n",
       "      <td>0.384616</td>\n",
       "      <td>0.195332</td>\n",
       "      <td>1.954090e-14</td>\n",
       "      <td>0.428376</td>\n",
       "      <td>0.236756</td>\n",
       "      <td>0.433034</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.004559</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2499.75000</td>\n",
       "      <td>0.007076</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.086719</td>\n",
       "      <td>0.000085</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>4999.50000</td>\n",
       "      <td>0.913158</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.309265</td>\n",
       "      <td>0.001002</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>7499.25000</td>\n",
       "      <td>0.999730</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.775881</td>\n",
       "      <td>0.028104</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>9999.00000</td>\n",
       "      <td>0.999999</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.645030</td>\n",
       "      <td>0.999848</td>\n",
       "      <td>1.552090e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             index    prediction        target       speedup      abs_diff  \\\n",
       "count  10000.00000  10000.000000  10000.000000  10000.000000  10000.000000   \n",
       "mean    4999.50000      0.587596      0.583100      0.438427      0.079464   \n",
       "std     2886.89568      0.455354      0.493082      0.384616      0.195332   \n",
       "min        0.00000      0.000001      0.000000      0.004559      0.000001   \n",
       "25%     2499.75000      0.007076      0.000000      0.086719      0.000085   \n",
       "50%     4999.50000      0.913158      1.000000      0.309265      0.001002   \n",
       "75%     7499.25000      0.999730      1.000000      0.775881      0.028104   \n",
       "max     9999.00000      0.999999      1.000000      2.645030      0.999848   \n",
       "\n",
       "            BCELoss   interchange          tile        unroll  \n",
       "count  1.000000e+04  10000.000000  10000.000000  10000.000000  \n",
       "mean   1.552090e-01      0.757900      0.940400      0.750000  \n",
       "std    1.954090e-14      0.428376      0.236756      0.433034  \n",
       "min    1.552090e-01      0.000000      0.000000      0.000000  \n",
       "25%    1.552090e-01      1.000000      1.000000      0.750000  \n",
       "50%    1.552090e-01      1.000000      1.000000      1.000000  \n",
       "75%    1.552090e-01      1.000000      1.000000      1.000000  \n",
       "max    1.552090e-01      1.000000      1.000000      1.000000  "
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>prediction</th>\n",
       "      <th>target</th>\n",
       "      <th>speedup</th>\n",
       "      <th>abs_diff</th>\n",
       "      <th>BCELoss</th>\n",
       "      <th>interchange</th>\n",
       "      <th>tile</th>\n",
       "      <th>unroll</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>10000.00000</td>\n",
       "      <td>1.000000e+04</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>1.000000e+04</td>\n",
       "      <td>1.000000e+04</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>14999.50000</td>\n",
       "      <td>6.021708e-01</td>\n",
       "      <td>0.613200</td>\n",
       "      <td>0.434748</td>\n",
       "      <td>5.877157e-02</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>0.782900</td>\n",
       "      <td>0.947300</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>2886.89568</td>\n",
       "      <td>4.620973e-01</td>\n",
       "      <td>0.487047</td>\n",
       "      <td>0.526266</td>\n",
       "      <td>1.711004e-01</td>\n",
       "      <td>1.293474e-14</td>\n",
       "      <td>0.412292</td>\n",
       "      <td>0.223445</td>\n",
       "      <td>0.433034</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>10000.00000</td>\n",
       "      <td>7.556801e-07</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.004063</td>\n",
       "      <td>2.384186e-07</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>12499.75000</td>\n",
       "      <td>3.441892e-03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.088260</td>\n",
       "      <td>4.777312e-05</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>14999.50000</td>\n",
       "      <td>9.715464e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.323237</td>\n",
       "      <td>4.986991e-04</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>17499.25000</td>\n",
       "      <td>9.998292e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.683457</td>\n",
       "      <td>9.279191e-03</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>19999.00000</td>\n",
       "      <td>9.999998e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>6.865816</td>\n",
       "      <td>9.995855e-01</td>\n",
       "      <td>1.092922e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             index    prediction        target       speedup      abs_diff  \\\n",
       "count  10000.00000  1.000000e+04  10000.000000  10000.000000  1.000000e+04   \n",
       "mean   14999.50000  6.021708e-01      0.613200      0.434748  5.877157e-02   \n",
       "std     2886.89568  4.620973e-01      0.487047      0.526266  1.711004e-01   \n",
       "min    10000.00000  7.556801e-07      0.000000      0.004063  2.384186e-07   \n",
       "25%    12499.75000  3.441892e-03      0.000000      0.088260  4.777312e-05   \n",
       "50%    14999.50000  9.715464e-01      1.000000      0.323237  4.986991e-04   \n",
       "75%    17499.25000  9.998292e-01      1.000000      0.683457  9.279191e-03   \n",
       "max    19999.00000  9.999998e-01      1.000000      6.865816  9.995855e-01   \n",
       "\n",
       "            BCELoss   interchange          tile        unroll  \n",
       "count  1.000000e+04  10000.000000  10000.000000  10000.000000  \n",
       "mean   1.092922e-01      0.782900      0.947300      0.750000  \n",
       "std    1.293474e-14      0.412292      0.223445      0.433034  \n",
       "min    1.092922e-01      0.000000      0.000000      0.000000  \n",
       "25%    1.092922e-01      1.000000      1.000000      0.750000  \n",
       "50%    1.092922e-01      1.000000      1.000000      1.000000  \n",
       "75%    1.092922e-01      1.000000      1.000000      1.000000  \n",
       "max    1.092922e-01      1.000000      1.000000      1.000000  "
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>prediction</th>\n",
       "      <th>target</th>\n",
       "      <th>speedup</th>\n",
       "      <th>abs_diff</th>\n",
       "      <th>BCELoss</th>\n",
       "      <th>interchange</th>\n",
       "      <th>tile</th>\n",
       "      <th>unroll</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>438876.000000</td>\n",
       "      <td>4.388760e+05</td>\n",
       "      <td>438876.000000</td>\n",
       "      <td>438876.000000</td>\n",
       "      <td>4.388760e+05</td>\n",
       "      <td>4.388760e+05</td>\n",
       "      <td>438876.000000</td>\n",
       "      <td>438876.000000</td>\n",
       "      <td>438876.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>239437.500000</td>\n",
       "      <td>5.950569e-01</td>\n",
       "      <td>0.591290</td>\n",
       "      <td>0.417869</td>\n",
       "      <td>5.254563e-02</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>0.770386</td>\n",
       "      <td>0.943353</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>126692.732707</td>\n",
       "      <td>4.624280e-01</td>\n",
       "      <td>0.491706</td>\n",
       "      <td>0.450577</td>\n",
       "      <td>1.506825e-01</td>\n",
       "      <td>4.088540e-13</td>\n",
       "      <td>0.420585</td>\n",
       "      <td>0.231167</td>\n",
       "      <td>0.433013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>20000.000000</td>\n",
       "      <td>1.216148e-07</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002826</td>\n",
       "      <td>1.216148e-07</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>129718.750000</td>\n",
       "      <td>3.437403e-03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.089580</td>\n",
       "      <td>4.446507e-05</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.750000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>239437.500000</td>\n",
       "      <td>9.678116e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.317024</td>\n",
       "      <td>4.407763e-04</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>349156.250000</td>\n",
       "      <td>9.998361e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.707023</td>\n",
       "      <td>1.071711e-02</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>458875.000000</td>\n",
       "      <td>9.999998e-01</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>26.579260</td>\n",
       "      <td>9.994106e-01</td>\n",
       "      <td>8.340904e-02</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               index    prediction         target        speedup  \\\n",
       "count  438876.000000  4.388760e+05  438876.000000  438876.000000   \n",
       "mean   239437.500000  5.950569e-01       0.591290       0.417869   \n",
       "std    126692.732707  4.624280e-01       0.491706       0.450577   \n",
       "min     20000.000000  1.216148e-07       0.000000       0.002826   \n",
       "25%    129718.750000  3.437403e-03       0.000000       0.089580   \n",
       "50%    239437.500000  9.678116e-01       1.000000       0.317024   \n",
       "75%    349156.250000  9.998361e-01       1.000000       0.707023   \n",
       "max    458875.000000  9.999998e-01       1.000000      26.579260   \n",
       "\n",
       "           abs_diff       BCELoss    interchange           tile         unroll  \n",
       "count  4.388760e+05  4.388760e+05  438876.000000  438876.000000  438876.000000  \n",
       "mean   5.254563e-02  8.340904e-02       0.770386       0.943353       0.750000  \n",
       "std    1.506825e-01  4.088540e-13       0.420585       0.231167       0.433013  \n",
       "min    1.216148e-07  8.340904e-02       0.000000       0.000000       0.000000  \n",
       "25%    4.446507e-05  8.340904e-02       1.000000       1.000000       0.750000  \n",
       "50%    4.407763e-04  8.340904e-02       1.000000       1.000000       1.000000  \n",
       "75%    1.071711e-02  8.340904e-02       1.000000       1.000000       1.000000  \n",
       "max    9.994106e-01  8.340904e-02       1.000000       1.000000       1.000000  "
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 0.5\n",
    "tn_t=test_df[(test_df['target']<=a) & (test_df['prediction']<=a)][['target','prediction']]\n",
    "tp_t=test_df[(test_df['target']>=a) & (test_df['prediction']>=a)][['target','prediction']]\n",
    "fn_t=test_df[(test_df['target']>=a) & (test_df['prediction']<=a)][['target','prediction']]\n",
    "fp_t=test_df[(test_df['target']<=a) & (test_df['prediction']>=a)][['target','prediction']]\n",
    "vfn_t=test_df[(test_df['speedup']>1) & (test_df['prediction']<=a)][['target','prediction']]\n",
    "\n",
    "tn_v=val_df[(val_df['target']<=a) & (val_df['prediction']<=a)][['target','prediction']]\n",
    "tp_v=val_df[(val_df['target']>=a) & (val_df['prediction']>=a)][['target','prediction']]\n",
    "fn_v=val_df[(val_df['target']>=a) & (val_df['prediction']<=a)][['target','prediction']]\n",
    "fp_v=val_df[(val_df['target']<=a) & (val_df['prediction']>=a)][['target','prediction']]\n",
    "vfn_v=val_df[(val_df['speedup']>1) & (val_df['prediction']<=a)][['target','prediction']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test set confustin matrix\n",
      "True positive:  5597      False negative: 234\n",
      "False positive: 376      True negative:  3793\n",
      "good schedules classified as below threshold: 2\n",
      "\n",
      "----\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      " speedup<0.2       0.94      0.91      0.93      4169\n",
      " speedup>0.2       0.94      0.96      0.95      5831\n",
      "\n",
      "    accuracy                           0.94     10000\n",
      "   macro avg       0.94      0.93      0.94     10000\n",
      "weighted avg       0.94      0.94      0.94     10000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"Test set confustin matrix\")\n",
    "print(f\"True positive:  {len(tp_t)}      False negative: {len(fn_t)}\")\n",
    "print(f\"False positive: {len(fp_t)}      True negative:  {len(tn_t)}\")\n",
    "print(f\"good schedules classified as below threshold: {len(vfn_t)}\")\n",
    "print(\"\\n----\")\n",
    "print(classification_report(test_df['target'], (test_df['prediction'] > 0.5).astype('int'), target_names=[f'speedup<{threshold}', f'speedup>{threshold}']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation set confustin matrix\n",
      "True positive:  5884      False negative: 248\n",
      "False positive: 189      True negative:  3679\n",
      "good schedules classified as below threshold: 1\n",
      "\n",
      "----\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      " speedup<0.2       0.94      0.95      0.94      3868\n",
      " speedup>0.2       0.97      0.96      0.96      6132\n",
      "\n",
      "    accuracy                           0.96     10000\n",
      "   macro avg       0.95      0.96      0.95     10000\n",
      "weighted avg       0.96      0.96      0.96     10000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"Validation set confustin matrix\")\n",
    "print(f\"True positive:  {len(tp_v)}      False negative: {len(fn_v)}\")\n",
    "print(f\"False positive: {len(fp_v)}      True negative:  {len(tn_v)}\")\n",
    "print(f\"good schedules classified as below threshold: {len(vfn_v)}\")\n",
    "print(\"\\n----\")\n",
    "print(classification_report(val_df['target'], (val_df['prediction'] > 0.5).astype('int'), target_names=[f'speedup<{threshold}', f'speedup>{threshold}']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "l=l.load(\"speedup_Adam_batch_norm_True_MAPE_nlayers_4_log_False_batch1001-2500_ELU_classif0.2\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
